/*******************************************************************************************
 *      @name   joker.c
 *      @brief  这是在linux系统下的使用HTTP协议对聚合API接口进行请求的代码案例
 *      @date   2025/02/25
 *      @author boluzs@126.com
 *      @note
 *              1.HTTP协议是基于请求/响应，
 *      @version  xx.xx.xx   主版本号.次版本号.修正版本号
 *
 *      CopyRight (c)   2024-2025   Your Name     All Right Reserved
 *
 * ****************************************************************************************/

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <time.h>

#define BUFSIZE 1024

// 聚合密钥
#define API_KEY "1129c894c9ab4f885124aa5f058cf75a"

// HTTP服务的端口
#define HTTP_PORT 80

// 聚合API的URL
// #define SERVER_URL "/joke/content/list"
#define SERVER_URL "/joke/randJoke"
// 聚合API的域名
#define SERVER_DOMAIN "v.juhe.cn"
// 聚合API的IP
#define SERVER_IP "203.107.54.210"

// 目标主机的端口和IP地址通过命令行传递   格式： ./xxx -- argv[0]  目标IP -- argv[1] 目标端口 -- argv[2]
int main(int argc, char **argv)
{

    char recvbuf[BUFSIZE] = {0}; // 存储响应内容
    char request[BUFSIZE] = {0}; // 存储请求内容

    // 1.创建TCP套接字
    int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == tcp_socket)
    {
        fprintf(stderr, "create tcp socket error,%s\n", strerror(errno));
        exit(-1);
    }

    // 2.向聚合API服务器发起连接请求
    struct sockaddr_in dest = {0};               // IPv4地址格式的实例
    dest.sin_family = AF_INET;                   // IPv4协议族
    dest.sin_port = htons(HTTP_PORT);            // 目标端口，需要转换为网络字节序
    dest.sin_addr.s_addr = inet_addr(SERVER_IP); // 目标地址，需要转换为网络字节序

    if (-1 == connect(tcp_socket, (struct sockaddr *)&dest, sizeof(dest)))
    {
        fprintf(stderr, "connect error,%s\n", strerror(errno));
        exit(-2);
    }

    printf("connect ok\n");

    for (;;)
    {
        // 3.可以和服务器进行通信，需要构造请求内容
        // int page = 1;
        // int pagesize = 1;
        // time_t now = time(NULL);
        // printf("请输入当前页数：");
        // scanf("%d", &page);
        // printf("请输入返回条数：");
        // scanf("%d", &pagesize);

        // sprintf(request, "GET %s?key=%s&sort=desc&page=%d&pagesize=%d&time=%ld HTTP/1.1\r\n"
        //                  "HOST: %s\r\n"
        //                  "Content-Type: application/x-www-form-urlencoded\r\n"
        //                  "\r\n",
        //         SERVER_URL, API_KEY, page, pagesize, now, SERVER_DOMAIN);
        sprintf(request, "GET %s?key=%s HTTP/1.1\r\n"
                         "HOST: %s\r\n"
                         "Content-Type: application/x-www-form-urlencoded\r\n"
                         "\r\n",
                SERVER_URL, API_KEY, SERVER_DOMAIN);

        // 4.发送请求
        send(tcp_socket, request, strlen(request), 0);
        printf("send ok\n");

        // 5.等待API的响应内容
        recv(tcp_socket, recvbuf, sizeof(recvbuf), 0);
        printf("返回的数据: %s\n", recvbuf);
        sleep(10);
    }

    return 0;
}
